package cn.hp.crm.service.impl;

import cn.hp.crm.dao.UserDao;
import cn.hp.crm.dao.impl.UserDaoImpl;
import cn.hp.crm.model.User;
import cn.hp.crm.service.UserService;
import cn.hp.crm.util.Constant;
import cn.hp.crm.util.PageBean;
import cn.hp.crm.util.ResultData;
import cn.hutool.core.util.StrUtil;
import com.mysql.cj.protocol.Resultset;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 用户的业务逻辑层     基于dao层
public class UserServiceImpl implements UserService {

    UserDao userDao = new UserDaoImpl();

    @Override
    public boolean login(String userName, String password) {
        return userDao.selectOneByNameAndPassword(userName ,password);
    }

    @Override
    public List<User> getAllUsers() {
        return userDao.selectAll();
    }

//    通过分页来将数据保存在分页工具类中
    @Override
    public PageBean getUsersByPage(PageBean pageBean, User user) {
//        设置pageBean总条数
        int allCount = userDao.getAllCount(user);
        pageBean.setTotalNumber(allCount);
//        自动设置总页数
        pageBean.setTotalPages();
//        设置pageBean中的集合数据
        List<User> users = userDao.getUsersLimit(pageBean,user);
        pageBean.setData(users);

        return pageBean;
    }

//    依赖于dao层， dao层返回的要么是 list  int  object
    @Override
    public ResultData resetPassword(Integer id) {
//        dao层返回修改的数据条数
        int count = userDao.updatePasswordById(id);
        if (count > 0){
            return ResultData.getSuccess(Constant.UPDATE_PASSWORD_SUCCESS_MSG);
        } else {
            return ResultData.getFail(Constant.UPDATE_PASSWORD_FAIL_MSG);
        }
    }

    @Override
    public ResultData delUsers(String[] ids) {
//        事物问题？
//        想要避免事物问题，直接执行一条sql语句
        int count = userDao.deleteById(ids);
        if (count > 0){
            return ResultData.getSuccess(Constant.UPDATE_PASSWORD_SUCCESS_MSG);
        } else {
            return ResultData.getFail(Constant.UPDATE_PASSWORD_FAIL_MSG);
        }
    }

//    新增一个用户
    @Override
    public ResultData addUser(User parameter) {
//       新增用户：1、判断当前用户名是否存在  2、不存在 新建  存在返回错误
        boolean flag = userDao.selectOneByName(parameter.getUserName());
        if (flag){  // 查到了当前名称下的数据 不让新增
            return ResultData.getFail("当前用户名以存在");
        }else { // 可以新增
            int count = userDao.add(parameter);
            if (count > 0){ // 执行成功
                return ResultData.getSuccess("添加用户成功");
            } else {
                return ResultData.getFail("添加失败");
            }
        }
    }

    @Override
    public ResultData updatePassword(String userName, String password, String newPassword) {
//        修改用户密码  1、验证用户密码是否匹配
        boolean flag = userDao.selectOneByNameAndPassword(userName, password);
        if (flag){ // true 表示用户名 密码正确
//            修改为新的密码
            int count = userDao.updatePasswordByName(userName,newPassword);
            if (count > 0){ // 执行成功
                return ResultData.getSuccess("修改密码成功");
            } else {
                return ResultData.getFail("修改失败");
            }
        }else {
            return ResultData.getFail("旧密码输入错误！");
        }
    }

//    修改用户头像业务
    @Override
    public ResultData updateImg(String user, String s) {
        int count = userDao.UpdateImgByName(user , s );
        if (count > 0){ // 执行成功
            return ResultData.getSuccess("修改头像成功");
        } else {
            return ResultData.getFail("修改失败");
        }
    }

//    获取当前用户的头像业务
    @Override
    public ResultData selectImg(String user) {
        String img = userDao.selectImgByName(user);
        if (!StrUtil.isEmpty(img)){
            return ResultData.getSuccessData("",img);
        }else {
            return ResultData.getFail("未上传头像");
        }
    }

//      获取业务员、管理员各人数
    @Override
    public ResultData selectTypeAndCount() {
        List<Map<String,Integer>> list = userDao.selectCountByType();
        List<String> types = new ArrayList();
        List counts = new ArrayList();
        if (!list.isEmpty()){ // 里面有数据  [ Map<> , Map<> ]
            for (Map<String ,Integer> map : list){  // map{ key-value , key-value}
                int type =  map.get("type");  // 标识 类型
                int count = map.get("count"); // 类型对应人数
                if (type == 1){
                    types.add("管理员");
                }else if (type == 2){
                    types.add("业务员");
                }
                counts.add(count);
            }
        }
        Map map = new HashMap();
        map.put("name" , types );
        map.put("count",counts);

        return ResultData.getSuccessData("",map);
    }


}
